class Watcher {
  constructor (vm, key, cb) {
    // vue实例
    this.vm = vm;
    // 属性名称
    this.key = key;
    // 每个观察者的处理问题可能会不一样所以使用传入一个回调函数，在函数里面就可以自定义一些个性化的操作。当数据变化的时候，调用 cb 更新视图 
    this.cb = cb;

    // 在 Dep 的静态属性上记录当前 watcher 对象，当访问数据的时候把 watcher 添加到 dep 的 subs 中
    Dep.target = this
    //  触发一次observer.js中的 getter，让 dep 为当前 key 记录 watcher
    this.oldValue = vm[key]
    // 清空 target
    Dep.target = null
  }
  // 当数据发生变化的时候更新视图
  update () {
    const newValue = this.vm[this.key]
    if (newValue === this.oldValue) {
      return
    }
    this.cb(newValue)
  }
}